package com.spring.pick2pick.common;

import org.apache.log4j.Logger;

public class PageHandler {

	// Logger 클래스의 인스턴스를 받아온다.
	static Logger logger = Logger.getLogger(PageHandler.class);
	
	private int nowPage = 1; // 현재 페이지
	private int totalArticleCount = 0; // 전체 글 개수
	private int pageArticleCount = 10; // 한 페이지에 보여질 글의 목록 수
	private int pageCount = 0; // 전체 페이지 수
	private int pageGroupCount = 10; // 한 그룹에 표시할 페이지번호 개수
	private int startPage = 0; // 현재 페이징 그룹의 시작페이지 번호
	private int endPage = 0; // 현재 페이징 그룹의 끝 페이지 번호
	private int startRec = 0; // 검색 범위의 시작 위치
	private int lastGroupFirstPage = 0;	// 마지막 그룹의 첫 페이지
	
	private static PageHandler current = null;
	
	public static void freeInstance() {
		if (current != null) {
			current = null;
		}
	}
	
	/**
	 * 현재 상태를 유지하면서 생성된 객체만을 리턴해 준다.
	 */
	public static PageHandler getInstance() {
		if (current == null) {
			current = new PageHandler();
		}
		return current;
	}

	/**
	 * "현재 페이지, 전체 데이터 수, 한 페이지당 목록 수, 페이지 그룹당 표시될 페이지의 수"에 대하여 파라미터로 설정 할 수 있다.
	 * 
	 * @param nowPage
	 *            현재 페이지
	 * @param totalArticleCount
	 *            전체 데이터 수
	 * @param pageArticleCount
	 *            한 페이지당 목록 수
	 * @param pageGroupCount
	 *            페이지 그룹당 표시될 페이지의 수
	 */
	public static PageHandler getInstance(int nowPage, int totalArticleCount,
			int pageArticleCount, int pageGroupCount) {
		
		if (current == null) {
			current = new PageHandler();
		}
		
		current.nowPage = nowPage;
		current.totalArticleCount = totalArticleCount;
		current.pageArticleCount = pageArticleCount;
		current.pageGroupCount = pageGroupCount;
		current.initPage();
		
		return current;
	}

	/**
	 * "현재 페이지, 전체 데이터 수"에 대하여 파라미터로 설정 할 수 있다. 나머지 값들은 멤버변수 선언시에 할당한 값들이 기본값으로
	 * 동작한다.
	 * 
	 * @param nowPage
	 *            현재 페이지
	 * @param totalArticleCount
	 *            전체 데이터 수
	 */
	public static PageHandler getInstance(int nowPage, int totalArticleCount) {
		if (current == null) {
			current = new PageHandler();
		}
		
		current.nowPage = nowPage;
		current.totalArticleCount = totalArticleCount;
		current.initPage();
		
		return current;
	}

	/**
	 * 페이지 계산식 구현
	 */
	private void initPage() {
		// 전체 페이지 수
		pageCount = ((totalArticleCount - 1) / pageArticleCount) + 1;

		// 현재 페이지에 대한 오차 조절
		if (nowPage < 0) {
			nowPage = 1;
		}
		if (nowPage > pageCount) {
			nowPage = pageCount;
		}

		// 현재 페이징 그룹의 시작 페이지 번호
		startPage = ((nowPage - 1) / pageGroupCount) * pageGroupCount + 1;

		// 현재 페이징 그룹의 끝 페이지 번호
		endPage = (((startPage - 1) + pageGroupCount) / pageGroupCount) * pageGroupCount;

		// 끝 페이지 번호가 전체 페이지수를 초과하면 오차범위 조절
		if (endPage > pageCount) {
			endPage = pageCount;
		}

		// LIMIT절의 시작 위치 값
		startRec = (nowPage - 1) * pageArticleCount;
		
		// 마지막 그룹의 첫 페이지
		// --> 전체 페이지 수 / 한 그룹당 페이지 수 (몫만 취하므로...)
		lastGroupFirstPage = (((pageCount - 1) / pageGroupCount) * pageGroupCount) + 1;
		
		logger.debug("-------------- paging values --------------");
		logger.debug("nowPage=" + nowPage); // 현재 페이지
		logger.debug("totalArticleCount=" + totalArticleCount); // 전체 글 개수
		logger.debug("pageArticleCount=" + pageArticleCount); // 한 페이지에 보여질 글의 목록 수
		logger.debug("pageCount=" + pageCount); // 전체 페이지 수
		logger.debug("pageGroupCount=" + pageGroupCount); // 한 그룹에 표시할 페이지번호 개수
		logger.debug("startPage=" + startPage); // 현재 페이징 그룹의 시작페이지 번호
		logger.debug("endPage=" + endPage); // 현재 페이징 그룹의 끝 페이지 번호
		logger.debug("startRec=" + startRec); // 검색 범위의 시작 위치
		logger.debug("lastGroupFirstPage=" + lastGroupFirstPage);	// 마지막 그룹의 첫 페이지
	}


	/***************** getter 추가 ******************/
	public int getNowPage() {
		return nowPage;
	}

	public int getTotalArticleCount() {
		return totalArticleCount;
	}

	public int getPageArticleCount() {
		return pageArticleCount;
	}

	public int getPageCount() {
		return pageCount;
	}

	public int getPageGroupCount() {
		return pageGroupCount;
	}

	public int getStartPage() {
		return startPage;
	}

	public int getEndPage() {
		return endPage;
	}

	public int getStartRec() {
		return startRec;
	}
	
	public int getLastGroupFirstPage() {
		return lastGroupFirstPage;
	}
	

}
